package edu.unice.simul.vue;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.util.Hashtable;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

import edu.unice.simul.util.stats.StatsContainer;
import edu.unice.simul.vue.graphes.Camembert;
import edu.unice.simul.vue.graphes.Courbe;
import edu.unice.simul.vue.graphes.Histogramme;

/**
 * Fenêtre de statistiques de fin de simulation
 * 
 * @author Romain Ciaccafava
 * 
 */
public class StatsFrame extends JFrame {
	private static final long serialVersionUID = -2861556840702709481L;
	private JTabbedPane tabbedPane = new JTabbedPane();

	public StatsFrame() {
		this.setTitle("Statistiques finales");
		this.setSize(700, 500);
		this.add(tabbedPane);
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

		setLocation((screenSize.width - getWidth()) / 2,
				(screenSize.height - getHeight()) / 2);
	}

	public void showFinalStats(StatsContainer stats) {
		buildFromStats(stats);
		setVisible(true);
	}

	/**
	 * Affiche les statistiques contenues par stats
	 * 
	 * @param stats
	 *          objet contenant les statistiques de fin de simulation
	 */
	private void buildFromStats(StatsContainer stats) {
		JPanel valuesPanel = new JPanel(new GridLayout(0, 3));

		JPanel tempsMoyenPanel = new JPanel();
		tempsMoyenPanel.setBorder(BorderFactory
				.createTitledBorder("Temps moyen de sortie"));
		JLabel jlabel = new JLabel(stats.getTempsMoyenDeSortie() + "");
		jlabel.setFont(new Font("Arial", Font.BOLD, 24));
		tempsMoyenPanel.add(jlabel);
		valuesPanel.add(tempsMoyenPanel);

		JPanel meilleurTempsPanel = new JPanel();
		meilleurTempsPanel.setBorder(BorderFactory
				.createTitledBorder("Meilleur temps de sortie"));
		jlabel = new JLabel(stats.getMeilleurTemps() + "");
		jlabel.setFont(new Font("Arial", Font.BOLD, 24));
		meilleurTempsPanel.add(jlabel);
		valuesPanel.add(meilleurTempsPanel);

		JPanel pireTempsPanel = new JPanel();
		pireTempsPanel.setBorder(BorderFactory
				.createTitledBorder("Pire temps de sortie"));
		jlabel = new JLabel(stats.getPireTemps() + "");
		jlabel.setFont(new Font("Arial", Font.BOLD, 24));
		pireTempsPanel.add(jlabel);
		valuesPanel.add(pireTempsPanel);

		JPanel ecartTypePanel = new JPanel();
		ecartTypePanel.setBorder(BorderFactory
				.createTitledBorder("Ecart type du temps de sortie"));
		jlabel = new JLabel(stats.getEcartType() + "");
		jlabel.setFont(new Font("Arial", Font.BOLD, 24));
		ecartTypePanel.add(jlabel);
		valuesPanel.add(ecartTypePanel);

		JPanel premiereMortPanel = new JPanel();
		premiereMortPanel.setBorder(BorderFactory
				.createTitledBorder("Temps de la première mort"));
		jlabel = new JLabel(stats.getTempsPremiereMort() + "");
		jlabel.setFont(new Font("Arial", Font.BOLD, 24));
		premiereMortPanel.add(jlabel);
		valuesPanel.add(premiereMortPanel);

		JPanel moyenneMortPanel = new JPanel();
		moyenneMortPanel.setBorder(BorderFactory
				.createTitledBorder("Temps moyen de mort"));
		jlabel = new JLabel(stats.getTempsMoyenMort() + "");
		jlabel.setFont(new Font("Arial", Font.BOLD, 24));
		moyenneMortPanel.add(jlabel);
		valuesPanel.add(moyenneMortPanel);

		tabbedPane.addTab("Statistiques", valuesPanel);

		Hashtable<String, Double> vivantsValues = new Hashtable<String, Double>();
		if (stats.getPersonnesEnVie() > 0)
			vivantsValues.put("En vie", (double) stats.getPersonnesEnVie());
		if (stats.getPersonnesMortes() > 0)
			vivantsValues.put("Morts", (double) stats.getPersonnesMortes());
		Camembert vivants = new Camembert(vivantsValues,
				"Personnes en vie VS personnes mortes");
		tabbedPane.addTab("Vivants / Morts", vivants);

		Courbe evolutionVivants = new Courbe(stats.getEvolutionVivants(),
				"Évolution du nombre de personnes vivantes en fonction du temps",
				"Temps", "Nombre de vivants");
		tabbedPane.addTab("Évolution des vivants", evolutionVivants);

		Histogramme tempsSortie = new Histogramme(stats.getTempsDeSortie(),
				"Temps de sortie", "Humains", "Temps (secondes)");
		tabbedPane.addTab("Temps de sortie", tempsSortie);

		Histogramme repartitionPortes = new Histogramme(
				stats.getRepartitionPortes(), "Répartition des portes",
				"Position des portes", "Nombre d'utilisations");
		tabbedPane.addTab("Répartition des portes", repartitionPortes);

		Courbe evolutionVie = new Courbe(stats.getPointsDeVieCumules(),
				"Moyenne du pourcentage de vie des humains", "Temps", "% de vie");
		tabbedPane.addTab("Évolution de la vie", evolutionVie);
	}
}